home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / misc / emu / TDMouse-1.1os.lha / TDMouse / Clock.c < prev    next >
C/C++ Source or Header  |  2000-10-06  |  7KB  |  307 lines

  1. /*
  2. // ##########################################################################
  3. // ####                                                                  ####
  4. // ####           TDMouse - A serial mouse driver for the Amiga          ####
  5. // ####          ===============================================         ####
  6. // ####                                                                  ####
  7. // #### Clock.c                                                          ####
  8. // ####                                                                  ####
  9. // #### Version 1.00  --  October 06, 2000                               ####
  10. // ####                                                                  ####
  11. // #### Copyright (C) 1995  Thomas Dreibholz                             ####
  12. // ####                     Molbachweg 7                                 ####
  13. // ####                     51674 Wiehl/Germany                          ####
  14. // ####                     EMail: Dreibholz@bigfoot.com                 ####
  15. // ####                     WWW:   http://www.bigfoot.com/~dreibholz     ####
  16. // ####                                                                  ####
  17. // ##########################################################################
  18. */
  19. /***************************************************************************
  20.  *                                                                         *
  21.  *   This program is free software; you can redistribute it and/or modify  *
  22.  *   it under the terms of the GNU General Public License as published by  *
  23.  *   the Free Software Foundation; either version 2 of the License, or     *
  24.  *   (at your option) any later version.                                   *
  25.  *                                                                         *
  26.  ***************************************************************************/
  27.  
  28.  
  29. #define TITLE "\nTDClock Version 1.00 - Copyright (C) 1995 by Thomas Dreibholz"
  30. #define PI2 (3.14159/180.0)
  31.  
  32. struct IntuitionBase *IntuitionBase;
  33. struct GfxBase       *GfxBase;
  34.  
  35. struct IOStdReq  *InputIO;
  36. struct MsgPort   *InputPort;
  37. LONG              InputDev=-1L;
  38. struct Interrupt  Interrupt;
  39. struct Task      *ThisTask;
  40.  
  41. extern APTR       IntRoutine;
  42. UBYTE             MidButton=0;
  43. BOOL              ende=FALSE;
  44. LONG              TSignal=-1L;
  45. ULONG             TSignalMask;
  46. UWORD             mx,my,vx,vy;
  47. UBYTE             std,min,sek;
  48.  
  49. struct Screen    *scr;
  50. struct RastPort  *rp;
  51. struct ViewPort  *vp;
  52. struct DateStamp  ds;
  53.  
  54. void IntHandler();
  55. void ShowTime();
  56. void ShowClock();
  57. extern FLOAT cos();
  58. extern FLOAT sin();
  59.  
  60. struct NewScreen ns=
  61. {
  62.  0,0,640,STDSCREENHEIGHT,2,
  63.  0,1,
  64.  HIRES,
  65.  CUSTOMSCREEN|SCREENQUIET,
  66.  0L,0L,0L,0L
  67. };
  68.  
  69. void CloseAll()
  70. {
  71.  if(InputDev==0)
  72.   {
  73.    InputIO->io_Data=&Interrupt;
  74.    InputIO->io_Command=IND_REMHANDLER;
  75.    DoIO(InputIO);
  76.    CloseDevice(InputIO);
  77.   }
  78.  if(InputIO) DeleteExtIO(InputIO);
  79.  if(InputPort) DeletePort(InputPort);
  80.  if(TSignal!=-1) FreeSignal(TSignal);
  81.  if(IntuitionBase) CloseLibrary(IntuitionBase);
  82.  if(GfxBase) CloseLibrary(GfxBase);
  83.  exit(0);
  84. }
  85.  
  86. void OpenAll()
  87. {
  88.  if((FindPort(TITLE))!=NULL)
  89.   {
  90.    puts("Das Programm wurde bereits gestartet. Ende mit Alt-F4!");
  91.    CloseAll();
  92.   }
  93.  
  94.  ThisTask=FindTask(NULL);
  95.  IntuitionBase=OpenLibrary("intuition.library",0L);
  96.  GfxBase=OpenLibrary("graphics.library",0L);
  97.  if((IntuitionBase==NULL)||(GfxBase==NULL)) CloseAll();
  98.  
  99.  InputPort=CreatePort(TITLE,0L);
  100.  if(InputPort==NULL)
  101.   { puts("FEHLER: Kann MsgPort nicht erstellen!");
  102.     CloseAll(); }
  103.  
  104.  InputIO=CreateExtIO(InputPort,sizeof(struct IOStdReq));
  105.  if(InputIO==NULL)
  106.   { puts("FEHLER: Kann IOStdReq nicht erstellen!");
  107.     CloseAll(); }
  108.  
  109.  TSignal=AllocSignal(-1L);
  110.  if(TSignal==-1L)
  111.   { puts("FEHLER: Kann Task-Signal nicht belegen!");
  112.     CloseAll(); }
  113.  TSignalMask=(1L<<TSignal);
  114.  
  115.  InputDev=OpenDevice("input.device",0,InputIO,0);
  116.  if(InputDev!=NULL)
  117.   { puts("FEHLER: Kann input.device nicht öffnen!");
  118.     CloseAll(); }
  119.  
  120.  Interrupt.is_Data=NULL;
  121.  Interrupt.is_Code=&IntRoutine;
  122.  Interrupt.is_Node.ln_Succ=NULL;
  123.  Interrupt.is_Node.ln_Pred=NULL;
  124.  Interrupt.is_Node.ln_Type=NT_INTERRUPT;
  125.  Interrupt.is_Node.ln_Name="clock.interrupt";
  126.  Interrupt.is_Node.ln_Pri=51;
  127.  InputIO->io_Data=&Interrupt;
  128.  InputIO->io_Command=IND_ADDHANDLER;
  129.  printf("%d\n",DoIO(InputIO));
  130. }
  131.  
  132. #asm
  133.    public _IntRoutine
  134.    public _geta4
  135. _IntRoutine:
  136.    movem.l a0-a6/d0-d7,-(sp)
  137.    move.l a0,-(sp)
  138.    jsr _geta4
  139.    jsr _IntHandler
  140.    addq.w #4,sp
  141.    movem.l (sp)+,a0-a6/d0-d7
  142.    rts
  143. #endasm
  144.  
  145. void IntHandler(Event)
  146.  struct InputEvent *Event;
  147. {
  148.  if(Event->ie_Class==IECLASS_RAWMOUSE)
  149.   {
  150.    if(Event->ie_Code==(IECODE_MBUTTON|IECODE_UP_PREFIX))
  151.     {
  152.        Disable();
  153.        if(MidButton==0) MidButton=1; else MidButton=0;
  154.        Enable();
  155.        Signal(ThisTask,TSignalMask);
  156.     }
  157.   }
  158.  else if(Event->ie_Class==IECLASS_RAWKEY)
  159.   {
  160.    if(Event->ie_Code==0x53)
  161.     {
  162.      if((Event->ie_Qualifier & IEQUALIFIER_LALT) || (Event->ie_Qualifier & IEQUALIFIER_RALT))
  163.       {
  164.        Disable();
  165.        ende=TRUE;
  166.        Enable();
  167.        Signal(ThisTask,TSignalMask);
  168.       }
  169.     }
  170.   }
  171. }
  172.  
  173. void main()
  174. {
  175.  UWORD ticks;
  176.  UBYTE m=0,mb;
  177.  
  178.  puts(TITLE);
  179.  OpenAll();
  180.  
  181.  while(ende==FALSE)
  182.   {
  183.    if(scr==NULL)
  184.      Wait(TSignalMask);
  185.    else
  186.     {
  187.      Delay(10);
  188.      ticks+=10;
  189.      if((ticks % 50)==0) ShowTime();
  190.      if(ticks>=150) { ShowClock(); ticks=0; }
  191.     }
  192.  
  193.    Disable();
  194.    mb=MidButton;
  195.    Enable();
  196.  
  197.    if((mb==1)&&(m==0))
  198.     {
  199.      m=1;
  200.      scr=OpenScreen(&ns);
  201.      if(scr!=NULL)
  202.       {
  203.        rp=&scr->RastPort;
  204.        vp=&scr->ViewPort;
  205.        SetRGB4(vp,0,0,0,0);
  206.        SetRGB4(vp,1,15,15,5);
  207.        SetRGB4(vp,2,8,8,8);
  208.        SetRGB4(vp,3,15,0,0);
  209.        srand((FLOAT)100);
  210.        mx=0xFFFF;
  211.        vx=95;
  212.        vy=40;
  213.        ticks=0;
  214.        ShowClock();
  215.       }
  216.     }
  217.    else if((mb==0)&&(m==1))
  218.     {
  219.      m=0;
  220.      if(scr)
  221.       {
  222.        CloseScreen(scr);
  223.        scr=NULL;
  224.       }
  225.     }
  226.   }
  227.  if(scr) CloseScreen(scr);
  228.  CloseAll();
  229. }
  230.  
  231. void Out(x,y,text)
  232.  UWORD  x,y;
  233.  UBYTE *text;
  234. {
  235.  SetAPen(rp,3);
  236.  Move(rp,x,y);
  237.  Text(rp,text,strlen(text));
  238. }
  239.  
  240. void ShowTime()
  241. {
  242.  UBYTE buffer[20];
  243.  
  244.  DateStamp(&ds);
  245.  std=ds.ds_Minute/60,
  246.  min=ds.ds_Minute % 60,
  247.  sek=ds.ds_Tick / 50;
  248.  
  249.  sprintf(&buffer,"%2d:%02d:%02d",std,min,sek);
  250.  Out(15,15,&buffer);
  251. }
  252.  
  253. void ShowClock()
  254. {
  255.  REGISTER UWORD   x,y,i;
  256.  REGISTER UWORD   xstd,xmin;
  257.  
  258.  if(mx!=0xFFFF)
  259.   {
  260.    SetAPen(rp,0);
  261.    RectFill(rp,mx-vx-2,my-vy-1,mx+vx+2,my+vy+1);
  262.   }
  263.  ShowTime();
  264.  
  265.  mx=(rand() % (636-2*vx-2))+vx;
  266.  my=(rand() % (196-2*vy-2))+vy;
  267.  
  268.  x=(UWORD)((FLOAT)mx+(FLOAT)vx*cos(0.0));
  269.  y=(UWORD)((FLOAT)my+(FLOAT)vy*sin(0.0));
  270.  SetAPen(rp,1);
  271.  RectFill(rp,mx-2,my-1,mx+2,my+1);
  272.  
  273.  SetAPen(rp,2);
  274.  Move(rp,x,y);
  275.  for(i=0;i<=360;i+=3)
  276.   {
  277.    x=(UWORD)((FLOAT)mx+(FLOAT)vx*cos((FLOAT)i*PI2));
  278.    y=(UWORD)((FLOAT)my+(FLOAT)vy*sin((FLOAT)i*PI2));
  279.    Draw(rp,x,y);
  280.   }
  281.  
  282.  for(i=0;i<=360;i+=(360/12))
  283.   {
  284.    x=(UWORD)((FLOAT)mx+(FLOAT)vx*cos((FLOAT)i*PI2));
  285.    y=(UWORD)((FLOAT)my+(FLOAT)vy*sin((FLOAT)i*PI2));
  286.    SetAPen(rp,1);
  287.    RectFill(rp,x-2,y-1,x+2,y+1);
  288.    SetAPen(rp,2);
  289.   }
  290.  
  291.  xmin=min*6-90;
  292.  SetAPen(rp,3);
  293.  Move(rp,mx,my);
  294.  x=(UWORD)((FLOAT)mx+(FLOAT)vx/1.2*cos((FLOAT)xmin*PI2));
  295.  y=(UWORD)((FLOAT)my+(FLOAT)vy/1.2*sin((FLOAT)xmin*PI2));
  296.  Draw(rp,x,y);
  297.  
  298.  if(std>11) std-=12;
  299.  xstd=(UWORD)((FLOAT)((FLOAT)std/12.0)*360.0+(FLOAT)((FLOAT)xmin/12.0))-90;
  300.  SetAPen(rp,2);
  301.  Move(rp,mx,my);
  302.  x=(UWORD)((FLOAT)mx+(FLOAT)vx/2.0*cos((FLOAT)xstd*PI2));
  303.  y=(UWORD)((FLOAT)my+(FLOAT)vy/2.0*sin((FLOAT)xstd*PI2));
  304.  Draw(rp,x,y);
  305. }
  306.  
  307.